ホームに戻る
出典 :
【WPF】RelativeSource(バインディング)の使い方メモ - Qiita
関連 :
データバインディング 依存関係プロパティ ユーザーコントロール
目次 :

RelativeSource とは

データバインディングのバインド先(Source)を相対的(Relative)に指定するための設定。
コントロールを参照する際に、コントロール名(絶対値)ではなく相対値を用いることができる。
DataContext のようにデータソース専用のオブジェクトを用意する必要が無いため、場合次第ではデータの管理がより簡便となる。
( Window にソースとなるプロパティを直接宣言する、といったことが可能。)

RelativeSource の指定(XAML)


依存関係プロパティ DependencyProp の値を、参照したオブジェクトのプロパティに同期させる場合を考える。
対象のオブジェクトを RelativeSource で指定し、プロパティを Path で指定した Binding を構成することで
DependencyProp が指定したプロパティに連動して変化するようになる。
ここで RelativeSource の Mode を指定することで、参照の仕方を切り替えることができる。Binding の Mode との混同に注意。

RelativeSource の類型

先祖のプロパティを参照 : Mode = FindAncestor

(XAML)

ここでは、Border の Width (幅)プロパティを、親要素 Canvas の ActualWidth (現在幅)に揃えようとしている。
RelativeSource を FindAncestor (先祖を探す)、対象となる先祖の型 (AncestorType) を Canvas としているため、
先祖を辿り、最初に見つかった Canvas がバインド先となる。また、AncestorLevel で、「何番目に見つかった先祖か」を指定することもできる。
自身を基準とした相対的な指定であり、バインド先のコントロール名に依存しない。
(バインド先となる Canvas に名前を設定する必要が無く、また名前が変わった場合も影響を受けない。)

FindAncestor は Mode の既定値であるため省略可能。即ち、以下の表記はいずれも等価である。
<!-- 通常の表記 --> RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=####} <!-- "Mode=" を省略 --> RelativeSource={RelativeSource FindAncestor, AncestorType=####} <!-- "Mode=FindAncestor" を省略 --> RelativeSource={RelativeSource AncestorType=####}

自身のプロパティを参照 : Mode = Self

(XAML)

ここでは、Border の Height (高さ)プロパティを、自身の ActualWidth (現在幅)に揃えることで、コントロールを正方形にしようとしている。

直前の要素のプロパティを参照 : Mode = PreviousData

(XAML)
<GroupBox> : </GroupBox> <!-- Button の Width は直前の要素 (PreviousData == GroupBox) の ActualWidth に同期する --> <Button Content="Sample" Width="{Binding Path=ActualWidth, RelativeSource={RelativeSource Mode=PreviousData}}"/>
直前に配置された要素のプロパティを参照する場合。

ユーザーコントロールにおける RelativeSource の活用

ユーザーコントロールを作成する際、子要素のプロパティ(依存関係プロパティ)を親要素であるユーザーコントロールのプロパティに
バインドすることで、ユーザーコントロールを使用する側はユーザーコントロールの内部構造を考慮することなく子要素のプロパティにアクセスできる。
詳細はリンク先を参照。

余談